from Tkinter import *
from Grilla import *
from Marca import *
from PartidaDeSopaDeLetras import *
import random


class VisualizadorDePartidaDeSopaDeLetras:
	#COLOR_MARCA = "Cyan"
	COLOR_MARCA_CORRECTA = "Green"
	COLOR_MARCA_INCORRECTA = "Red"
	
	
	def __init__(self, unaPartidaDeUnaSopaDeLetras, root):

		self.__root = Frame(root)
		self.__root.pack(anchor=CENTER);

		grilla = unaPartidaDeUnaSopaDeLetras.sopaDeLetras().grilla()
		self.__partida = unaPartidaDeUnaSopaDeLetras
		self.__partida.suscribirObservador( self )

		self.__controlador = ""

		#Inicializacion de la grilla de botones
		self.__botones = []
		for i in range(grilla.ancho()):
			FrameGrilla = Frame(self.__root)
			FrameGrilla.pack(side=TOP)

			self.__botones.append([])
			for j in range(grilla.alto()):
				posicion = Posicion(i, j)
				w = Button( FrameGrilla, height=1, width=2, text = grilla.letraEn(posicion) )
				w.pack(side=LEFT)
				self.__botones[i].append(w)
		#Fin de Inicializacion de la Grilla

		#Inicializacion de las Palabras a buscar
		FrameGrilla = Frame(self.__root)
		FrameGrilla.pack(side=BOTTOM)

		for palabra in self.__partida.palabrasABuscar():
			labelPalabra=Label(text=palabra)
			labelPalabra.pack(side=BOTTOM)

		labelTitulo = Label(text="Palabras a buscar:")
		labelTitulo.pack(side=BOTTOM)
		
		self.__labelTiempo = Label(text="0")
		self.__labelTiempo.pack(side=BOTTOM)
		#Fin de la Inicializacion de las Palabras a buscar

		#Boton Terminar Juego
		FrameGrilla = Frame(self.__root)
		FrameGrilla.pack(side=BOTTOM)
		self.__botonTerminarJuego = Button(FrameGrilla, height=1, width=15, text="Terminar Juego", bg="Green")
		self.__botonTerminarJuego.pack(side=BOTTOM)
		#Fin boton terminar

	def nuevaMarca(self, marca,color="Cyan"):
		self.__marcarEntrePosiciones(marca.posicionInicial(), marca.posicionFinal(), color)
	
	def resultados(self, marcasCorrectas, marcasIncorrectas, puntaje):
		self.__mostrarResultados(marcasCorrectas, marcasIncorrectas, puntaje)

	def habilitarBoton(self, posicion):
		self.__botones[posicion.x()][posicion.y()].config(state=ACTIVE)

	def deshabilitarBoton(self, posicion):
		self.__botones[posicion.x()][posicion.y()].config(state=DISABLED)
	
	def deshabilitarBotonTerminar(self):
		self.__botonTerminarJuego.config(state=DISABLED)

	def setearControlador(self, controlador):
		self.__controlador = controlador
		grilla = self.__partida.sopaDeLetras().grilla()
		for i in range(grilla.ancho()):
			for j in range(grilla.alto()):
				posicion = Posicion(i, j)
				self.__botones[i][j].config(command=(lambda d = (i, j) : controlador.seApretoBotonGrilla( d ) ))
				self.__botones[i][j].pack()
		self.__botonTerminarJuego.config(command=controlador.seApretoBotonTerminar )
	
	def actualizarReloj(self, tiempo):
		self.__labelTiempo.config(text=str(tiempo))
	
	def __marcarEntrePosiciones(self, posicionInicial, posicionFinal,color):
		difX = float(posicionFinal.x()) - float(posicionInicial.x())
		difY = float(posicionFinal.y()) - float(posicionInicial.y())

		z = max (abs(difX), abs(difY))

		vel = Posicion(difX/z, difY/z)

		for i in range(int(z+1)):
			self.__botones[int(posicionInicial.x()+ i*vel.x())][int(posicionInicial.y() + i*vel.y())].config(bg=color,activebackground=color)
			self.__botones[int(posicionInicial.x()+ i*vel.x())][int(posicionInicial.y() + i*vel.y())].pack()

	def __mostrarResultados(self, marcasCorrectas, marcasIncorrectas, puntaje):
		for marcaIncorrecta in marcasIncorrectas:
			self.nuevaMarca(marcaIncorrecta, self.COLOR_MARCA_INCORRECTA)
		for marcaCorrecta in marcasCorrectas:
			self.nuevaMarca(marcaCorrecta, self.COLOR_MARCA_CORRECTA)
		labelPuntaje=Label(text="Puntaje : " + str(puntaje))
		labelPuntaje.pack(side=BOTTOM)
